home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / IEFBACK.SA < prev    next >
Text File  |  1989-08-30  |  10KB  |  188 lines

  1.          TTL       IEEE FORMAT EQUIVALENT BACK-END ROUTINES (IEFBACK)
  2. IEFBACK  IDNT   1,1  IEEE FORMAT EQUIVALENT BACK-END ROUTINES
  3. ******************************************
  4. *  (C)  COPYRIGHT 1981 BY MOTOROLA INC.  *
  5. ******************************************
  6.  
  7.          SECTION   9
  8.  
  9. ****************************************************************
  10. *              IEFRTNAN (INTERNAL ROUTINE)                     *
  11. *  IEEE FORMAT EQUIVALENT FAST FLOATING POINT RETURN NAN       *
  12. *                                                              *
  13. *  INPUT: SP -> +0  ORIGINAL CALLERS D3-D7 REGISTERS           *
  14. *              +20  ORIGINAL CALLERS RETURN ADDRESS            *
  15. *                                                              *
  16. *  OUTPUT: D7 - A NEWLY CREATED NAN (NOT-A-NUMBER)             *
  17. *          CCR - THE "V" BIT IS FORCED ON                      *
  18. *                                                              *
  19. *          AND DIRECT RETURN TO THE ORIGINAL CALLER            *
  20. *                                                              *
  21. *  PURPOSE:  CALLED WHENEVER THE RESULT OF AN OPERATION        *
  22. *          IS ILLEGAL OR UNDEFINED AND A NAN RESULT MUST       *
  23. *          BE GENERATED AS THE FINAL RESULT.                   *
  24. *                                                              *
  25. *   THE IEEE FORMAT DEFINED NAN IS DETERMINED BY AN EXPONENT   *
  26. *   OF ALL ONE'S AND A NON-ZERO SIGNIFICAND.  THE SIGN BIT     *
  27. *   IS A DON'T CARE.  THE IEEE STANDARD LEAVES UP TO EACH      *
  28. *   IMPLEMENTATION WHAT IS PLACED IN THE SIGNIFICAND.  HERE    *
  29. *   WE WILL GENERATE THE LOW ORDER 23 BITS OF THE ORIGINAL     *
  30. *   CALLER'S RETURN ADDRESS.  HOWEVER, THIS MAY NOT BE         *
  31. *   SUFFICIENT - IF ALL 23 BITS HAPPEN TO BE ZERO OR THE       *
  32. *   ADDRESS IS LARGER THAN 23 BITS THIS WOULD LEAD TO AN       *
  33. *   INCORRECT RESULT.  THERFORE, IF THIS HAPPENS ONLY THE LOW  *
  34. *   ORDER SIGNIFICAND BIT IS SET ON WITH THE REST ZEROES.      *
  35. *   THIS REPRESENTS AN ODD ADDRESS (ILLEGAL WITH CURRENT M68000*
  36. *   INSTRUCTION ALIGNMENT RESTRICTIONS) AND ANY INTERESTED     *
  37. *   PARTY CAN TELL IF SUCH A SUBSTITUTION HAS TAKEN PLACE.     *
  38. *   ALSO, IF THIS WAS ILLEGALLY ASSUMED TO BE AN ADDRESS AND   *
  39. *   USED, AN ADDRESS EXCEPTION TRAP WOULD ENSUE THUS NOT       *
  40. *   ALLOWING ITS USE AS A VALID ADDRESS.                       *
  41. *                                                              *
  42. ****************************************************************
  43.  
  44. SIGNMSK  EQU       $80000000 IEEE FORMAT SIGN ISOLATION MASK
  45. EXPMSK   EQU       $7F800000 IEEE FORMAT EXPONENT MASK
  46. VBIT     EQU       $0002     CONDITION CODE "V" BIT MASK
  47. ZBIT     EQU       $0004     CONDITION CODE "Z" BIT MASK
  48.  
  49.          XDEF      IEFRTNAN  RETURN NAN RESULT ROUTINE
  50.  
  51. IEFRTNAN MOVEM.L   (SP)+,D3-D7         RESTORE CALLERS REGISTERS
  52.          MOVE.L    (SP),D7             LOAD UP RETURN ADDRESS
  53.          AND.L     #SIGNMSK+EXPMSK,D7  VERIFY NOT LARGER THAN 23 BITS
  54.          BNE.S     IEFNONE             IT IS, CANNOT USE IT - RETURN A ONE
  55.          MOVE.L    (SP),D7             LOAD UP RETURN ADDRESS
  56.          AND.L     #$007FFFFF,D7       ISOLATE ADDRESS BITS REQUIRED
  57.          BNE.S     IEFNZRO             BRANCH IF NOT ZERO
  58. IEFNONE  MOVE.L    #1,D7               SET ONLY LOW BIT ON
  59. IEFNZRO  OR.L      #EXPMSK,D7          FORCE EXPONENT ALL ONES
  60.          OR.B      #VBIT,CCR           RETURN WITH "V" BIT SET
  61.          RTS                           RETURN TO ORIGINAL CALLER
  62.          PAGE
  63. **********************************************************
  64. *           IEFTIEEE (INTERNAL SUBROUTINE)               *
  65. *  IEEE FORMAT COMPATIBLE CONVERT FFP TO IEEE FORMAT     *
  66. *                                                        *
  67. *  INPUT: D7 - RESULT OF FAST FLOATING POINT OPERATION   *
  68. *         CCR - SET FOR ABOVE RESULT                     *
  69. *         SP -> +0  ORIGINAL CALLERS SAVED D3-D7         *
  70. *              +20  ORIGINAL CALLERS RETURN ADDRESS      *
  71. *                                                        *
  72. *  OUTPUT: D7 - IEEE FORMAT EQUIVALENT OF THE RESULT     *
  73. *                                                        *
  74. *  CONDITION CODE:                                       *
  75. *                                                        *
  76. *              N - SET IF THE RESULT IS NEGATIVE         *
  77. *              Z - SET IF THE RESULT IS ZERO             *
  78. *              V - CLEARED (NOT NAN)                     *
  79. *              C - CLEARED                               *
  80. *              X - UNDEFINED                             *
  81. *                                                        *
  82. *    ALL FAST FLOATING POINT NUMBERS HAVE AN EXACT       *
  83. *    IEEE FORMAT REPRESENTATION.  SINCE THE FAST         *
  84. *    FLOATING POINT ROUTINES ALWAYS SET THE "V" BIT      *
  85. *    FOR OVERFLOWS AND RETURNS THE PROPER SIGN, WE       *
  86. *    CAN EASILY CHANGE THE RESULT TO AN IEEE INFINITY    *
  87. *    AND UNFLAG THE "V" BIT.                             *
  88. *                                                        *
  89. **********************************************************
  90.  
  91.          XDEF      IEFTIEEE  RETURN IEEE RESULT TO ORIGINAL CALLER
  92.  
  93. IEFTIEEE BVS.S     IEFVSET   BRANCH IF OVERFLOW FFP RESULT
  94.          ADD.L     D7,D7     DELETE MANTISSA HIGH BIT
  95.          BEQ.S     IEFTRTN   BRANCH ZERO AS FINISHED
  96.          EOR.B     #$80,D7   TO TWOS COMPLEMENT EXPONENT
  97.          ASR.B     #1,D7     FORM 8-BIT EXPONENT
  98.          SUB.B     #$82,D7   ADJUST 64 TO 127 AND EXCESSIZE
  99.          SWAP.W    D7        SWAP FOR HIGH BYTE PLACEMENT
  100.          ROL.L     #7,D7     SET SIGN+EXP IN HIGH BYTE
  101. IEFTRTN  TST.L     D7        TEST "Z" AND "N", CLEAR "V" AND "C" IN CCR
  102.          MOVEM.L   (SP)+,D3-D6 RESTORE D3 THRU D6 CALLERS REGISTERS
  103.          ADD.L     #4,SP     SKIP ORIGINAL D7
  104.          RTS                 RETURN TO ORIGINAL CALLER WITH RESULT
  105.  
  106. * OVERFLOW - SET TO PROPER IEEE FORMAT INFINITY
  107. IEFVSET  ADD.B     D7,D7     SAVE SIGN BIT IN "X"
  108.          MOVE.L    #EXPMSK<<1,D7 SET EXPONENT OF ONES SHIFTED LEFT
  109.          ROXR.L    #1,D7     INSERT PROPER SIGN
  110.          BRA       IEFTRTN   AND RETURN TO ORIGINAL CALLER
  111.          PAGE
  112. *******************************************************************
  113. *  GENERAL PURPOSE RETURN ROUTINES                                *
  114. *                                                                 *
  115. *  THE FOLLOWING ROUTINES RETURN A SPECIFIC FINAL RESULT          *
  116. *  TO THE ORIGINAL CALLER WITH THE PROPER CONDITION CODES         *
  117. *  SET AS FOLLOWS:                                                *
  118. *                                                                 *
  119. *              N - THE RESULT IS NEGATIVE                         *
  120. *              Z - THE RESULT IS A ZERO                           *
  121. *              V - CLEARED (NOT A NAN)                            *
  122. *              C - UNDEFINED                                      *
  123. *              X - UNDEFINED                                      *
  124. *                                                                 *
  125. *  THE ROUTINES ARE AS FOLLOWS:                                   *
  126. *                                                                 *
  127. *   IEFRTD7  - RETURN THE CURRENT CONTENTS OF D7                  *
  128. *   IEFRTOD7 - RETURN THE ORIGINAL CONTENTS OF D7                 *
  129. *   IEFRTSZ  - RETURN A SIGNED ZERO (SIGN IS BIT 31 OF D7)        *
  130. *   IEFRTIE  - RETURN INFINITY WITH SIGN EXCLUSIVE OR OF          *
  131. *              ORIGINAL ARGUMENT SIGNS                            *
  132. *   IEFRTSZE - RETURN SIGNED ZERO WITH SIGN EXCLUSIV OR           *
  133. *              OF ORIGINAL ARGUMENT SIGNS                         *
  134. *                                                                 *
  135. *******************************************************************
  136.  
  137.          XDEF      IEFRTD7,IEFRTSZ,IEFRTOD7,IEFRTIE,IEFRTSZE
  138.  
  139. **********************
  140. * RETURN ORIGINAL D7 *
  141. * (CANT BE NEG ZERO) *
  142. **********************
  143. IEFRTOD7 MOVE.L    16(SP),D7  LOAD ORIGINAL D7 INTO D7
  144.  
  145. *********************
  146. * RETURN CURRENT D7 *
  147. * (CANT BE NEG ZERO)*
  148. *********************
  149. IEFRTD7  MOVEM.L   (SP)+,D3-D6         LOAD ALL BUT D7 REGISTERS BACK UP
  150.          ADD.L     #4,SP     SKIP ORIGINAL D7 ON STACK
  151.          ADD.L     D7,D7     CHECK FOR SIGNED ZERO
  152.          BEQ.S     IEFWASZ   BRANCH IF WAS A ZERO
  153.          ROXR.L    #1,D7     VALUE BACK INTO POSITION SET CCR ("V" CLEAR)
  154.          RTS                 RETURN TO CALLER WITH CCR AND RESULT
  155.  
  156. **************************************
  157. * RETURN SIGNED ZERO WITH SIGN BEING *
  158. * EOR OF THE ORIGINAL OPERANDS       *
  159. **************************************
  160. IEFRTSZE MOVEM.L   12(SP),D6-D7 LOAD ORIGINAL ARGUMENTS
  161.          EOR.L     D6,D7     PRODUCE PROPER SIGN
  162.  
  163. **********************
  164. * RETURN SIGNED ZERO *
  165. * D7 BIT31 HAS SIGN  *
  166. **********************
  167. IEFRTSZ  MOVEM.L   (SP)+,D3-D6 LOAD ALL BUT D7 BACK UP
  168.          ADD.L     #4,SP     SKIP ORIGINAL D7 ON STACK
  169.          ADD.L     D7,D7     SET SIGN BIT INTO CARRY
  170.          MOVE.L    #0,D7     ZERO D7
  171. IEFWASZ  ROXR.L    #1,D7     SET SIGN BIT BACK IN ("V" CLEARED)
  172.          OR.B      #ZBIT,CCR  FORCE ZERO BIT ON IN CCR
  173.          RTS
  174.  
  175. *********************************
  176. * RETURN INFINITY WITH EOR SIGN *
  177. * OF ORIGINAL ARGUMENTS         *
  178. *********************************
  179. IEFRTIE  MOVEM.L   (SP)+,D3-D7 RESTORE ORIGINAL ARGUMENTS
  180.          EOR.L     D6,D7   PRODUCE PROPER SIGN
  181.          ADD.L     D7,D7     SHIFT SIGN OUT
  182.          MOVE.L    #EXPMSK<<1,D7 SETUP INFINITY (EXPONENT ALL ONES)
  183.          ROXR.L    #1,D7     SET SIGN BACK IN ("V" CLEARED)
  184.          RTS                 RETURN WITH RESULT AND CCR SET
  185.  
  186.          END
  187.  
  188.